package br.uem.din.sd.jogodistribuido.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.uem.din.sd.jogodistribuido.domain.Jogador;
import br.uem.din.sd.jogodistribuido.domain.Jogador;
import javax.persistence.Query;

public class JogadorDao {

    protected EntityManager entityManager;

    public JogadorDao() {
        entityManager = getEntityManager();
    }

    private static JogadorDao jogadorDao = init();

    private static JogadorDao init() {
        if (jogadorDao == null) {
            jogadorDao = new JogadorDao();
            return jogadorDao;
        } else {
            return jogadorDao;
        }
    }

    public static JogadorDao getInstance() {
        return jogadorDao;
    }
    
    private EntityManager getEntityManager() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jogo");
        if (entityManager == null) {
            entityManager = factory.createEntityManager();
        }

        return entityManager;
    }

    public Jogador getById(final Long id) {
        return entityManager.find(Jogador.class, id);
    }

    @SuppressWarnings("unchecked")
    public List<Jogador> list() {
        return entityManager.createQuery("FROM " + Jogador.class.getName()).getResultList();
    }

    public void insert(Jogador jogador) {
        try {
            entityManager.getTransaction().begin();
            entityManager.persist(jogador);
            entityManager.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            entityManager.getTransaction().rollback();
            throw new RuntimeException("Falha ao tentar salvar o jogador " + jogador.getNome(), ex);
        }
    }

    public void update(Jogador jogador) {
        try {
            entityManager.getTransaction().begin();
            entityManager.merge(jogador);
            entityManager.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            entityManager.getTransaction().rollback();
        }
    }

    public void delete(Jogador jogador) {
        try {
            entityManager.getTransaction().begin();
            jogador = entityManager.find(Jogador.class, jogador.getId());
            entityManager.remove(jogador);
            entityManager.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            entityManager.getTransaction().rollback();
        }
    }

    public void deleteById(final Long id) {
        try {
            Jogador jogador = getById(id);
            delete(jogador);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public Jogador findByLogin(String login) {
        
        Jogador jogador = new Jogador();
        String queryStr = "from Jogador j where j.login = '"+login+"'";
        Query query = entityManager.createQuery(queryStr);

        if(query.getResultList().size() > 0){
            jogador = (Jogador) query.getResultList().get(0);
        }
        
        return jogador;
    }
}
